package com.frank.oj.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.lang.reflect.Method;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @author frank
 * @Date 2024/4/3
 */
@Configuration
@Slf4j(topic = "hcoj")
public class AsyncTaskConfig implements AsyncConfigurer {
    /**
     * 初始化并配置一个线程池任务执行器（ThreadPoolTaskExecutor）
     * 配置详情如下：
     * 1. 核心线程池大小为10；
     * 2. 最大线程池大小为20；
     * 3. 队列容量为200；
     * 4. 线程的空闲保持时间为3秒；
     * 5. 拒绝执行策略使用CallerRunsPolicy，即调用者运行策略；
     * 6. 线程名称前缀为"CommonThread-"。
     *
     * @return 配置完成的ThreadPoolTaskExecutor实例。
     */
    @Override
    public Executor getAsyncExecutor() {



            ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
            taskExecutor.setCorePoolSize(10); // 设置核心线程池大小
            taskExecutor.setMaxPoolSize(20); // 设置最大线程池大小
            taskExecutor.setQueueCapacity(200); // 设置队列容量
            taskExecutor.setKeepAliveSeconds(3); // 设置线程的空闲时间
            taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 设置拒绝执行策略
            taskExecutor.setThreadNamePrefix("CommonThread-"); // 设置线程名称前缀
            taskExecutor.initialize(); // 初始化线程池

            return taskExecutor;
    }

    /**
     * 异步任务异常处理
     */
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {

        return new AsyncUncaughtExceptionHandler() {
            @Override
            public void handleUncaughtException(Throwable throwable, Method method, Object... objects) {
                log.error("################"+throwable.getMessage()+"################",throwable);
                log.error("exception method:"+method.getName());
            }
        };
    }
}
